package com.cmwa.solution.sys.menu.service;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.cmwa.solution.base.entity.Employee;
import com.cmwa.solution.base.entity.Page;
import com.cmwa.solution.base.entity.SearchParam;
import com.cmwa.solution.exception.RepositoryException;
import com.cmwa.solution.sys.menu.entity.MenuVo;

public interface MenuService {

	/**
	 * 列表页面数据
	 * 
	 * @param sp
	 * @return
	 */
	Page<MenuVo> menuListPage(SearchParam sp);

	void saveMenu(MenuVo menu) throws RepositoryException;

	MenuVo queryMenuById(String menuId);
	
	MenuVo queryMenuByUrl(String url);

	/**
	 * 查询包含三级的菜单列表数据
	 * 
	 * @return
	 */
	List<MenuVo> queryThreeLevelMenuList(String belongSystem);

	/**
	 * 查询全部的菜单
	 * 
	 * @return
	 */
	List<MenuVo> queryAllMenu();

	/**
	 * 查询最大序列号加一
	 * 
	 * @return
	 */
	Integer queryNextSequence();

	/**
	 * 根据名称，查询匹配的菜单列表
	 * 
	 * @param menuNM
	 * @return
	 */
	List<MenuVo> queryMatchMenuList(String menuNM);

	/**
	 * 检查名称是否在在
	 * 
	 * @param menuNM
	 * @param menuId
	 * @return
	 */
	boolean checkRepeatMenuNM(String menuNM, String menuId);

	/**
	 * 根据选择的菜单ID，查询这些菜单之下的全部按钮级别的菜单列表
	 * 
	 * @param menuIds
	 * @return
	 */
	List<MenuVo> queryAllButtonMenuByMenuIds(String menuIds, String mType, String belongSystem);

	/**
	 * 
	 * @param menuIds
	 * @return
	 */
	public List<MenuVo> queryButtonListByMenuIds(String menuIds, String mType, String belongSystem);

	/**
	 * 查询全部菜单，排除按钮级别的菜单
	 * 
	 * @return
	 */
	Map<String, MenuVo> queryAllRealMenu();

	/**
	 * 更新保存菜单数据
	 * 
	 * @param menu
	 */
	void updateMenu(MenuVo menu);

	/**
	 * 是否有子类菜单
	 * 
	 * @param parentId
	 * @return
	 */
	boolean hasSubMenu(String parentId);

	/**
	 * 逻辑删除菜单
	 * 
	 * @param menuId
	 */
	void deleteMenuWithStatus(String menuId);

	/**
	 * 按钮列表
	 * 
	 * @param sp
	 * @return
	 */
	Page<MenuVo> buttonListPage(SearchParam sp);

	/**
	 * 根据代码查询按钮菜单
	 * 
	 * @param code
	 * @return
	 */
	MenuVo queryMenuByCode(String code);

	/**
	 * 检查菜单URL是否存在
	 * 
	 * @param url
	 * @param menuId
	 * @return
	 */
	boolean checkRepeatURL(String url, String menuId);
	
	/**
	 * 根据当前用户所属数据角色（多个），查询所有关联的操作角色所拥有的操作权限
	 * @param empId
	 * @return
	 */
	List<MenuVo> queryMenuListByEmpAndOperRole(@Param("empId")String empId);
	
	/**
	 * 根据用户ID，查询默认选中的按钮菜单
	 * 
	 * @param checkResolving
	 * @return
	 */
	List<MenuVo> queryEmpDefaultSelectedButtonMenu(String checkResolving);

	/**
	 * 根据岗位信息，查询默认选中的按钮菜单
	 * 
	 * @param checkResolving
	 * @return
	 */
	List<MenuVo> queryOrmemberDefaultSelectedButtonMenu(String checkResolving);
	
	/**
	 * 根据人员ID和模糊匹配代码查询对应的代码集合
	 * @param empId
	 * @param mCode
	 * @return
	 */
	List<String> queryMcodeByEmpIdAndMcode(String empId, String mCode);
	
	/**
	 * 构建当前用户左边菜单分级列表
	 * 
	 * @param user
	 * @param ctxPath
	 * @return
	 */
	Map<Integer, List<MenuVo>> buildMenuMap(Employee user);
	
	/**
	 * 获取当前登录人的菜单权限
	 * 根据当前用户所属的数据角色（多个），查询所有关联的操作角色所拥有的操作权限，并缓存在内存中，需对操作权限去重
	 * @author ex-sujh
	 * @date 2018年7月10日10:33:36
	 * @param user
	 * @return
	 */
	Map<String, MenuVo> getCurrentUserMenu(Employee user);
	
	/**
	 * 构建一个完整的树，从叶子节点开始，得到这个叶子节点所有的父节点数据
	 * 
	 * @param allMenu
	 * @param loginMenuList
	 * @param menuVo
	 */
	void buildAssociatedMenu(Map<String, MenuVo> allMenu, Map<String, MenuVo> loginMenuList, MenuVo menuVo);
	
	/**
	 * 递归取得树上的父节点的数据
	 * 
	 * @param allMenu
	 * @param loginMenuList
	 * @param menuVo
	 */
	void associatedMenu(Map<String, MenuVo> allMenu, Map<String, MenuVo> loginMenuList, MenuVo menuVo);
	
	/**
	 * 检查是否有效的URL
	 * @param url
	 * @return
	 */
	boolean isVaildURL(String url);
	
	/**
	 * 根据人员ID查询有权限的系统菜单
	 * @param empId
	 * @param mCode
	 * @return
	 */
	List<String> queryAuthMenuByEmpId(@Param("empId") String empId);
}
